<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // Object.defineProperties(object, descriptors)对某个对象进行多个属性统一定义属性功能描述
        //     object:将要添加属性的目标对象
        //     descriptors:取值类型是对象，key是需要定义的属性名称，value是该属性的相关描述，取值是对象

        var user={};
        var num=20;
        var u=Object.defineProperties(user,{
            name:{
                value:"tom",
                writable:false,
                enumerable:false,
                configurable:false
            },
            age:{
                get(){
                    return num;
                },
                set(val){
                    num=val;
                },
                enumerable:false,
                configurable:false
            }
        });
        console.log(user);
        console.log(user.age);
        console.log(u===user);

        // Object.getOwnPropertyDescriptor(object, propertyName)
        // 从一个对象中获取指定属性的相关信息(如:是否可写、可删除、可遍历)
        var nameDesc=Object.getOwnPropertyDescriptor(user,"name");
        console.log(nameDesc);

        // Object.getPrototypeOf(object)获取原型方法，这是ES6中新增的方法
        console.log(Object.getPrototypeOf(user));

        // Object.getOwnPropertyNames(object)获取指定对象中的所有属性名称，返回一个属性名组成的数组(包含不能循环的属性)
        var keys=Object.getOwnPropertyNames(user);
        console.log(keys);

        console.log("------------------");
        // Object.preventExtensions(object)限定指定对象不能增加属性
        // Object.isExtensible(object)判断指定对象是否可以新增属性
        var userA={
            name:"tom"
        };
        console.log("是否可以新增属性:",Object.isExtensible(userA));
        userA.age=30;
        Object.preventExtensions(userA);
        console.log("是否可以新增属性",Object.isExtensible(userA));
        userA.sex="男";
        console.log("删除age",delete userA.age);
        console.log(userA);

        console.log("-----------------------------");
        // Object.seal(object)限定指定对象不能增加属性,也不能删除属性
        // Object.isSealed(object)返回一个布尔值，表示这个对象是否已是密封的
        var userB={
            name:"tom"
        };
        console.log("对象是否为安全对象:",Object.isSealed(userB));
        userB.age=30;
        Object.seal(userB);
        console.log("对象是否为安全对象:",Object.isSealed(userB));
        userB.name="哈哈哈";
        userB.sex="男";
        console.log(delete userB.age);
        console.log(userB);

        console.log("-------------------------------");
        // Object.freeze(object) 限定指定对象不能增加属性,也不能删除属性,也不能修改属性
        // Object.isFrozen(object)返回一个布尔值，表示这个对象是否已被冻结
        var userC={
            username:"cici",
            age:40
        };
        Object.freeze(userC);
        userC.username="hello";
        console.log(delete userC.age);
        console.log(userC);
        console.log("对象是否被冻结:",Object.isFrozen(userC));
    </script>
</head>
<body>
    
</body>
</html>